SIP

会话初始协议(Session Initiation Protocol,SIP)是一个控制发起、修改和终结交互式多媒体会话的信令协议,主要用于创建、修改和释放一个或多个参与者的会话。SIP是由 IETF(Internet Engineering Task Force,Internet工程任务组)在 RFC 2543 中定义的,最早发布于 1999 年 3 月,后来在 2002 年 6 月又发布了一个新的标准 RFC 2361。

SIP 是一个基于文本的协议,报文格式与 HTTP和SMTP 相似。下面是SIP 请求与 HTTP 请求的一个简单的对比:

HTTP请求:GET /index.html HTTP/1.1

SIP请求:INVITE sip:seven@freeswitch.org.cn SIP/2.0

由此可见,SIP/HTTP请求一般由请求动作、资源地址和协议版本等三部分所组成。在HTTP请求中,GET指明一个获取资源(文件)的动作,而/index.html则是资源的地址,最后是HTTP协议版本号;在SIP请求中,INVITE表示发起一次会话建立请求,seven@freeswitch.org.cn为请求的URI地址(称为SIP URI),最后是SIP协议版本号。其中,SIP URI类似电子邮件地址,其格式为“协议:名称@主机地址”。

此外,SIP是一个支持对等通信的信令协议,可在无中心的服务器的情况下,只要通信双方都彼此知道对方地址,就可以直接进行端到端通信。

JsSIP

JsSIP是一个实现了SIP协议功能的、简单易用的JavaScript库。它可以利用SIP和WebRTC在任何网站上实现一个全功能的SIP端点(Endpoint)。使用JsSIP的任何网站都可以使用音频的实时通信功能。

2.2.1 状态转移图

使用JsSIP发起语音通话的状态转移图如下图所示:

图1. JsSIP语音通话状态转移图

上图中,“IDLE”指通话的待机状态,即在发起通话之前或结束通话之后SDK均返回此状态;“Trying”指通话发起状态,即在主叫用户发起通话之后,且被叫用户尚未接听之前,通话双方均处于此状态;“ANSWER”指通话接听状态,即在被叫用户接听来电之后,通话双方均处于接听状态;“HANGUP”指通话结束状态,且无论通话双方谁先结束通话,双方都将进入此状态。此外,一旦进入HANGUP状态,SDK会自动转移到IDLE状态。

APP在使用通话功能模块时,需要根据通话的当前状态,或SDK的通话状态通知,显示相应的通话界面,以及执行正确的通话控制操作。

2.2.1 会话控制类

类jssip.rtcsession表示WebRTC媒体(音频/视频)会话,它可以由本地用户或远程对等方发起,其中内部包含有rtcninja.rtcpeerconnection实例(可接受音视频连接属性)。

2.2.3 Rtcninja模块

WebRTC规范尚不完善,为了在不同的浏览器中透明的实现实时音视频通讯,特地引入了这个库。

2.2.4 事件处理

JSSIP所有的异步 I/O 操作在完成时都会发送一个事件到事件队列,然后由EventEmiter通过回调函数的形式发送给Web页面,而这些回调函数一般都封装在一些对象之中(例如:call.on('accepted',function(e)))。

2.2.5 调用方法

调用JsSIP对象的时序图如下图所示

图2. JSSIP的时序图

由上图可见,JsSIP库主要提供7个对象(注:SDK目前没有用到消息模块)。这些对象之间的调用关系如下:

① JsSIP首先创建UA对象;

② UA对象接着先后创建Transport对象和Session对象;

③ Session对象创建Requestsender和Transaction对象;

④ 最终由Transport对象将SIP报文发送出去的。